package xfuzzy.alg_genetico.indeterminado.codification;

import java.util.List;

import xfuzzy.xfghl.codification.DoubleChromosome;
import xfuzzy.xfhl.model.hierStruct.XfhlINode;
import xfuzzy.xfhl.model.hierStruct.XfhlModule;

public class GeneradorEquivalencias {

//	public static void generadorEstructurasEquivalentes(DoubleChromosome cromosoma)  {
//		
//		XfhlModule modulo = Encoder.decodeBackwardAnchura(cromosoma);
//		modulo.imprime();
//		XfhlModule copiaModulo = null;
//		//int numModulos = cromosoma.getNumModulos();
//		copiaModulo = (XfhlModule) modulo.copiar();
//		System.out.println(cromosoma.getCodificacion());
//		XfhlINode entrada = copiaModulo.getEnt1();
//		copiaModulo.setEnt1(copiaModulo.getEnt2());
//		copiaModulo.setEnt2(entrada);
//		DoubleChromosome cromosoma2 = Encoder.codeBackwardAnchura(copiaModulo, cromosoma.getNumVariables());
//		System.out.println(cromosoma2.getCodificacion());
//	}
	
	public static void realizarGiro(XfhlModule modulo)  {
	
		XfhlINode entrada1 = modulo.getEnt1();
		modulo.setEnt1(modulo.getEnt2());
		modulo.setEnt2(entrada1);
	}
	
//	public static void metodoSinNombre(DoubleChromosome cromosoma)  {
//		
//		//DoubleChromosome cromosoma2 = null;
//		int numModulos = cromosoma.getNumModulos();
//		List<XfhlModule> modulos = new ArrayList<XfhlModule>();
//		List<XfhlModule> modulosProvisional = new ArrayList<XfhlModule>();
//		XfhlModule modulo = Encoder.decodeBackwardAnchura(cromosoma);
//		modulosProvisional.add(modulo);
//		modulos.add(modulo);
//		XfhlModule actual = null;
//		while (modulos.size() < numModulos)  {
//			actual = modulosProvisional.remove(0);
//			if (actual.getEnt1() instanceof XfhlModule)  {
//				modulos.add((XfhlModule) actual.getEnt1());
//				modulosProvisional.add((XfhlModule) actual.getEnt1());
//			}
//			if (actual.getEnt2() instanceof XfhlModule)  {
//				modulos.add((XfhlModule) actual.getEnt2());
//				modulosProvisional.add((XfhlModule) actual.getEnt2());
//			}
//		}
//		
//		//System.out.println("Original = " + cromosoma.getCodificacion());
//		//XfhlModuleToGraph.createGraph(modulo, "original_graph" + cromosoma.getCodificacion());
//		
//		for (int i = 0; i < numModulos; i++)  {
//			 realizarGiro(modulos.get(i));
//			 //cromosoma2 = Encoder.codeBackwardAnchura(modulo, cromosoma.getNumVariables());
//			 //System.out.println(cromosoma2.getCodificacion());
//			 //XfhlModuleToGraph.createGraph(modulo, "graph" + cromosoma2.getCodificacion());
//			 for (int j = 0; j < numModulos; j++)  {
//				  realizarGiro(modulos.get(j));
//				  //cromosoma2 = Encoder.codeBackwardAnchura(modulo, cromosoma.getNumVariables());
//				  //cromosoma.addPosibilidad(cromosoma2.getCodificacion());
//				  //System.out.println(cromosoma2.getCodificacion());
//				  //XfhlModuleToGraph.createGraph(modulo, "graph" + cromosoma2.getCodificacion());
//			 }
//			 realizarGiro(modulos.get(i));
//		}
//		//cromosoma.verPosibilidades();
//	}
	
//	public static void metodoSinNombre2(DoubleChromosome cromosoma)  {
//		
//		int numModulos = cromosoma.getNumModulos();
//		List<XfhlModule> modulos = new ArrayList<XfhlModule>();
//		List<XfhlModule> modulosProvisional = new ArrayList<XfhlModule>();
//		XfhlModule actual = null;
//		XfhlModule modulo = Encoder.decodeBackwardAnchura(cromosoma);
//		modulosProvisional.add(modulo);
//		modulos.add(modulo);
//		
//		while (modulos.size() < numModulos)  {
//			actual = modulosProvisional.remove(0);
//			if (actual.getEnt1() instanceof XfhlModule)  {
//				modulos.add((XfhlModule) actual.getEnt1());
//				modulosProvisional.add((XfhlModule) actual.getEnt1());
//			}
//			if (actual.getEnt2() instanceof XfhlModule)  {
//				modulos.add((XfhlModule) actual.getEnt2());
//				modulosProvisional.add((XfhlModule) actual.getEnt2());
//			}
//		}
//		
//		for (int i = 0; i < numModulos; i++)  {
//			 realizarGiro(modulos.get(i));
//			 //DoubleChromosome cromosoma2 = Encoder.codeBackwardAnchura(modulo, cromosoma.getNumVariables());
//			 //String codificacion = cromosoma2.getCodificacion();
//			 //cromosoma.addPosibilidad(codificacion);
//			 if (i < numModulos - 1)
//				 generarTodas(modulos, i + 1, cromosoma, modulo);
//			 realizarGiro(modulos.get(i));
//		}
//		//cromosoma.verPosibilidades();
//	}
	
	public static void generarTodas(List<XfhlModule> modulos, int i, DoubleChromosome cromosoma, XfhlModule modulo)   {
		
		//DoubleChromosome cromosoma2 = null;
		//String codificacion = "";
		if (i == cromosoma.getNumModulos() - 1)  {
			realizarGiro(modulos.get(i));
			//cromosoma2 = Encoder.codeBackwardAnchura(modulo, cromosoma.getNumVariables());
			//codificacion = cromosoma2.getCodificacion();
			//cromosoma.addPosibilidad(codificacion);
			realizarGiro(modulos.get(i));
		}
		else  {
			realizarGiro(modulos.get(i));
			//cromosoma2 = Encoder.codeBackwardAnchura(modulo, cromosoma.getNumVariables());
			//codificacion = cromosoma2.getCodificacion();
			//cromosoma.addPosibilidad(codificacion);
			generarTodas(modulos, i + 1, cromosoma, modulo);
			realizarGiro(modulos.get(i));
			generarTodas(modulos, i + 1, cromosoma, modulo);
		}
	}
}
